
let data = { config: `
swagger: "2.0"
info:
  description: >
    这是 Swagger-SQL 示例服务 —— 宠物商店服务。
    Swagger-SQL 是一个后台服务程序。通过 Swagger-SQL,
    您只需要配置 Swagger API 和对应的 SQL 语句, 即可实现 RESTful API 后台服务。
    请前往 <a href="https://gitee.com/swagger-sql">https://gitee.com/swagger-sql</a> 
    了解更多关于 Swagger-SQL 程序和使用相关信息。
  version: 1.0.0
  title: Swagger-SQL 宠物商店
  termsOfService: "https://gitee.com/swagger-sql"
  contact:
    email: "hejiang@tju.edu.cn"
  license:
    name: Apache 2.0 授权
    url: "http://www.apache.org/licenses/LICENSE-2.0.html"
basePath: /v2
tags:
  - name: pet
    description: 有关宠物的各种信息
    externalDocs:
      description: 更多信息
      url: "https://gitee.com/swagger-sql"
  - name: store
    description: 用户操作
  - name: user
    description: 宠物商店订单
    externalDocs:
      description: 有关商店的更多信息
      url: "https://gitee.com/swagger-sql"
schemes:
  - http
paths:
  /pet:
    post:
      tags:
        - pet
      summary: 添加一个新宠物到商店
      description: ""
      operationId: addPet
      consumes:
        - application/json
      produces:
        - application/json
      parameters:
        - in: body
          name: body
          description: 待添加到商店的宠物对象信息
          required: false
          schema:
            $ref: "#/definitions/Pet"
      responses:
        "405":
          description: 宠物信息无效
      security:
        - petstore_auth:
            - "write:pets"
            - "read:pets"
    put:
      tags:
        - pet
      summary: 更新一个已存在的宠物的信息
      description: ""
      operationId: updatePet
      consumes:
        - application/json
      produces:
        - application/json
      parameters:
        - in: body
          name: body
          description: 待更新的宠物对象信息
          required: false
          schema:
            $ref: "#/definitions/Pet"
      responses:
        "400":
          description: 无效的宠物 ID
        "404":
          description: 没有找到这只宠物
        "405":
          description: 宠物信息无效
      security:
        - petstore_auth:
            - "write:pets"
            - "read:pets"
  /pet/findByStatus:
    get:
      tags:
        - pet
      summary: Finds Pets by status
      description: Multiple status values can be provided with comma separated strings
      operationId: findPetsByStatus
      consumes:
        - application/xml
        - application/json
        - multipart/form-data
        - application/x-www-form-urlencoded
      produces:
        - application/xml
        - application/json
      parameters:
        - name: status
          in: query
          description: Status values that need to be considered for filter
          required: false
          type: array
          items:
            type: string
          collectionFormat: multi
          default: available
          enum:
            - available
            - pending
            - sold
      responses:
        "200":
          description: successful operation
          schema:
            type: array
            items:
              $ref: "#/definitions/Pet"
        "400":
          description: Invalid status value
      security:
        - petstore_auth:
            - "write:pets"
            - "read:pets"
  /pet/findByTags:
    get:
      tags:
        - pet
      summary: Finds Pets by tags
      description: "Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing."
      operationId: findPetsByTags
      produces:
        - application/xml
        - application/json
      parameters:
        - name: tags
          in: query
          description: Tags to filter by
          required: false
          type: array
          items:
            type: string
          collectionFormat: multi
      responses:
        "200":
          description: successful operation
          schema:
            type: array
            items:
              $ref: "#/definitions/Pet"
        "400":
          description: Invalid tag value
      security:
        - petstore_auth:
            - "write:pets"
            - "read:pets"
  "/pet/{petId}":
    get:
      tags:
        - pet
      summary: Find pet by ID
      description: Returns a single pet
      operationId: getPetById
      consumes:
        - application/x-www-form-urlencoded
      produces:
        - application/json
      parameters:
        - name: petId
          in: path
          description: ID of pet to return
          required: true
          type: string
      responses:
        "200":
          description: successful operation
          schema:
            $ref: "#/definitions/Pet"
        "400":
          description: Invalid ID supplied
        "404":
          description: Pet not found
      security:
        - api_key: []
        - petstore_auth:
            - "write:pets"
            - "read:pets"
      x-actions:
        - sql: SELECT * FROM product WHERE productid = @petId;
        - expr: ans.get(0)
    post:
      tags:
        - pet
      summary: Updates a pet in the store with form data
      description: ""
      operationId: updatePetWithForm
      consumes:
        - application/x-www-form-urlencoded
      produces:
        - application/xml
        - application/json
      parameters:
        - name: petId
          in: path
          description: ID of pet that needs to be updated
          required: true
          type: string
        - name: name
          in: formData
          description: Updated name of the pet
          required: false
          type: string
        - name: status
          in: formData
          description: Updated status of the pet
          required: false
          type: string
      responses:
        "405":
          description: Invalid input
      security:
        - petstore_auth:
            - "write:pets"
            - "read:pets"
    delete:
      tags:
        - pet
      summary: Deletes a pet
      description: ""
      operationId: deletePet
      consumes:
        - multipart/form-data
        - application/x-www-form-urlencoded
      produces:
        - application/xml
        - application/json
      parameters:
        - name: api_key
          in: header
          description: ""
          required: false
          type: string
        - name: petId
          in: path
          description: Pet id to delete
          required: true
          type: integer
          format: int64
      responses:
        "400":
          description: Invalid pet value
      security:
        - petstore_auth:
            - "write:pets"
            - "read:pets"
  "/pet/{petId}/uploadImage":
    post:
      tags:
        - pet
      summary: uploads an image
      description: ""
      operationId: uploadFile
      consumes:
        - multipart/form-data
      produces:
        - application/json
      parameters:
        - name: petId
          in: path
          description: ID of pet to update
          required: true
          type: integer
          format: int64
        - name: additionalMetadata
          in: formData
          description: Additional data to pass to server
          required: false
          type: string
        - name: file
          in: formData
          description: file to upload
          required: false
          type: file
      responses:
        "200":
          description: successful operation
          schema:
            $ref: "#/definitions/ApiResponse"
      security:
        - petstore_auth:
            - "write:pets"
            - "read:pets"
  /store/inventory:
    get:
      tags:
        - store
      summary: Returns pet inventories by status
      description: Returns a map of status codes to quantities
      operationId: getInventory
      produces:
        - application/json
      parameters: []
      responses:
        "200":
          description: successful operation
          schema:
            type: object
            additionalProperties:
              type: integer
              format: int32
      security:
        - api_key: []
  /store/order:
    post:
      tags:
        - store
      summary: Place an order for a pet
      description: ""
      operationId: placeOrder
      produces:
        - application/xml
        - application/json
      parameters:
        - in: body
          name: body
          description: order placed for purchasing the pet
          required: false
          schema:
            $ref: "#/definitions/Order"
      responses:
        "200":
          description: successful operation
          schema:
            $ref: "#/definitions/Order"
        "400":
          description: Invalid Order
  "/store/order/{orderId}":
    get:
      tags:
        - store
      summary: Find purchase order by ID
      description: "For valid response try integer IDs with value <= 5 or > 10. Other values will generated exceptions"
      operationId: getOrderById
      produces:
        - application/json
      parameters:
        - name: orderId
          in: path
          description: ID of pet that needs to be fetched
          required: true
          type: string
      responses:
        "200":
          description: successful operation
          schema:
            $ref: "#/definitions/Order"
        "400":
          description: Invalid ID supplied
        "404":
          description: Order not found
    delete:
      tags:
        - store
      summary: Delete purchase order by ID
      description: For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors
      operationId: deleteOrder
      produces:
        - application/json
      parameters:
        - name: orderId
          in: path
          description: ID of the order that needs to be deleted
          required: true
          type: string
      responses:
        "400":
          description: Invalid ID supplied
        "404":
          description: Order not found
  /user:
    post:
      tags:
        - user
      summary: Create user
      description: This can only be done by the logged in user.
      operationId: createUser
      produces:
        - application/json
      parameters:
        - in: body
          name: body
          description: Created user object
          required: false
          schema:
            $ref: "#/definitions/User"
      responses:
        default:
          description: successful operation
  /user/createWithArray:
    post:
      tags:
        - user
      summary: Creates list of users with given input array
      description: ""
      operationId: createUsersWithArrayInput
      produces:
        - application/json
      parameters:
        - in: body
          name: body
          description: List of user object
          required: false
          schema:
            type: array
            items:
              $ref: "#/definitions/User"
      responses:
        default:
          description: successful operation
  /user/createWithList:
    post:
      tags:
        - user
      summary: Creates list of users with given input array
      description: ""
      operationId: createUsersWithListInput
      produces:
        - application/json
      parameters:
        - in: body
          name: body
          description: List of user object
          required: false
          schema:
            type: array
            items:
              $ref: "#/definitions/User"
      responses:
        default:
          description: successful operation
  /user/login:
    get:
      tags:
        - user
      summary: Logs user into the system
      description: ""
      operationId: loginUser
      produces:
        - application/json
      parameters:
        - name: username
          in: query
          description: The user name for login
          required: false
          type: string
        - name: password
          in: query
          description: The password for login in clear text
          required: false
          type: string
        - name: name
          in: query
          description: The password for login in clear text
          required: false
          type: string
      responses:
        "200":
          description: successful operation
          schema:
            type: string
          headers:
            X-Rate-Limit:
              type: integer
              format: int32
              description: calls per hour allowed by the user
            X-Expires-After:
              type: string
              format: date-time
              description: date in UTC when toekn expires
        "400":
          description: Invalid username/password supplied
  /user/logout:
    get:
      tags:
        - user
      summary: Logs out current logged in user session
      description: ""
      operationId: logoutUser
      produces:
        - application/json
      parameters: []
      responses:
        default:
          description: successful operation
  "/user/{username}":
    get:
      tags:
        - user
      summary: Get user by user name
      description: ""
      operationId: getUserByName
      produces:
        - application/xml
        - application/json
      parameters:
        - name: username
          in: path
          description: "The name that needs to be fetched. Use user1 for testing. "
          required: true
          type: string
      responses:
        "200":
          description: successful operation
          schema:
            $ref: "#/definitions/User"
        "400":
          description: Invalid username supplied
        "404":
          description: User not found
    put:
      tags:
        - user
      summary: Updated user
      description: This can only be done by the logged in user.
      operationId: updateUser
      produces:
        - application/xml
        - application/json
      parameters:
        - name: username
          in: path
          description: name that need to be deleted
          required: true
          type: string
        - in: body
          name: body
          description: Updated user object
          required: false
          schema:
            $ref: "#/definitions/User"
      responses:
        "400":
          description: Invalid user supplied
        "404":
          description: User not found
    delete:
      tags:
        - user
      summary: Delete user
      description: This can only be done by the logged in user.
      operationId: deleteUser
      produces:
        - application/xml
        - application/json
      parameters:
        - name: username
          in: path
          description: The name that needs to be deleted
          required: true
          type: string
      responses:
        "400":
          description: Invalid username supplied
        "404":
          description: User not found
securityDefinitions:
  petstore_auth:
    type: oauth2
    authorizationUrl: "http://petstore.swagger.io/api/oauth/dialog"
    flow: implicit
    scopes:
      "write:pets": modify pets in your account
      "read:pets": read your pets
  api_key:
    type: apiKey
    name: api_key
    in: header
definitions:
  Order:
    properties:
      id:
        type: integer
        format: int64
      petId:
        type: integer
        format: int64
      quantity:
        type: integer
        format: int32
      shipDate:
        type: string
        format: date-time
      status:
        type: string
        description: Order Status
        enum:
          - placed
          - approved
          - delivered
      complete:
        type: boolean
    xml:
      name: Order
  Category:
    properties:
      id:
        type: integer
        format: int64
      name:
        type: string
    xml:
      name: Category
  User:
    properties:
      id:
        type: integer
        format: int64
      username:
        type: string
      firstName:
        type: string
      lastName:
        type: string
      email:
        type: string
      password:
        type: string
      phone:
        type: string
      userStatus:
        type: integer
        format: int32
        description: User Status
    xml:
      name: User
  Tag:
    properties:
      id:
        type: integer
        format: int64
      name:
        type: string
    xml:
      name: Tag
  Pet:
    required:
      - name
      - photoUrls
    properties:
      id:
        type: integer
        format: int64
      category:
        $ref: "#/definitions/Category"
      name:
        type: string
        example: doggie
      photoUrls:
        type: array
        xml:
          name: photoUrl
          wrapped: true
        items:
          type: string
      tags:
        type: array
        xml:
          name: tag
          wrapped: true
        items:
          $ref: "#/definitions/Tag"
      status:
        type: string
        description: pet status in the store
        enum:
          - available
          - pending
          - sold
    xml:
      name: Pet
  ApiResponse:
    properties:
      code:
        type: integer
        format: int32
      type:
        type: string
      message:
        type: string
    xml:
      name: "##default"
externalDocs:
  description: 了解 Swagger-SQL 更多信息
  url: "http://hejiang.gitee.io"

x-datasource:
  driverClassName: org.h2.Driver
  url: jdbc:h2:mem:petstore;MODE=MYSQL;DB_CLOSE_DELAY=-1;DATABASE_TO_UPPER=false
  username: sa
  password: sa
  validationQuery: SELECT 1;
` };

function fetchSwaggerConfig(req, res) {
  return res.json(data);
}

function updateSwaggerConfig(req, res) {
  const { body } = req;
  const { config } = body;
  data.config = config;

  return res.json(data);
}

export default {
  'GET  /api/swagger': fetchSwaggerConfig,
  'PUT  /api/swagger': updateSwaggerConfig,
};
